// cf-439e
// 题意：现在有n(<=10^5)块甜点，有f(<=n)个人，现在要给没人分蛋糕，每个人
//       要至少有一块，并且所有人分到的数目的最大公约数必需为1。问有多少
//       种方案，输出方案模1000000007。
//
// 题解：很容易想到一种状态f(n, f)表示f个人分n块按题目要求的方案数。
//       可以得到：
//         f(n, f)=c(n-1, f-1)-sigma(f(n/i, f), i>1 && i | n)
//       其中c是组合数n-1个取出f-1个。
//
//       这个可以dp，加点预处理和记忆化能过。
//       其实移一下项就会发现
//         c(n-1, f-1) = sigma(f(n/i, f), i | n)
//       这不就是莫比乌斯反演么。就可以算出f了。
//       复杂度O(nlog n)
//
// run: $exec < input
#include <iostream>
#include <vector>
#include <map>

int const maxn = 100007;
long long const mo = 1000000007;
long long fact[maxn];
long long fact_inv[maxn];
long long df[maxn];
int vis[maxn];
int tick;

std::vector<int> factor[maxn];
std::map<std::pair<int, int>, long long> ans;

void init_factor()
{
	for (int i = 2; i < maxn; i++)
		for (int j = i; j < maxn; j += i)
			factor[j].push_back(i);
}

template <class T>
void extended_gcd(T a, T b, T & d, T & x, T & y)
{
	if (!b) { d = a; x = 1; y = 0; }
	else {
		extended_gcd(b, a % b, d, y, x);
		y -= x * (a/b);
	}
}

template <class T>
T inverse(T t, T p)
{
	T x, y, d;
	extended_gcd(t, p, d, x, y);
	return (x % p + p) % p;
}

void init_fact_inv()
{
	fact[0] = 1;
	for (int i = 1; i < maxn; i++) {
		fact[i] = (fact[i - 1] * i) % mo;
		fact_inv[i] = inverse(fact[i], mo);
	}
}

long long c(int n, int m)
{
	if (m > n) return 0;
	if (!m) return 1;
	return (fact[n] * inverse((fact[m] * fact[n - m]) % mo, mo)) % mo;
}

long long dp(int n, int f)
{
	if (n < f) return 0;
	if (n == f) return 1;
	if (vis[n] == tick) return df[n];
	long long ret = c(n - 1, f - 1);
	for (auto i : factor[n])
		ret -= dp(n / i, f);
	vis[n] = tick;
	return df[n] = ((ret % mo) + mo) % mo;
}

int main()
{
	init_factor();
	init_fact_inv();
	std::ios::sync_with_stdio(false);
	int T;
	std::cin >> T;
	while (T--) {
		tick++;
		int n, f;
		std::cin >> n >> f;
		auto l = std::make_pair(n, f);
		if (ans.find(l) != ans.end()) {
			std::cout << ans[l] << '\n';
			continue;
		}
		if (f == 1) {
			std::cout << (n == 1) << '\n';
			continue;
		}
		std::cout << (ans[l] = dp(n, f)) << '\n';
	}
}

